/*
-----------------------------------------------------------------------------
This file is part of NxGraphics, Multimedia Engine.
Author : Stephane Kyles. Developed in Prague, Czech Republic.
				_   __      _    __ _      __           
			   / | / /_  __| |  / /(_)____/ /___   ____ 
			  /  |/ /| |/_/| | / // // __  // _ \ / __ \
			 / /|  /_>  <  | |/ // // /_/ //  __// /_/ /
			/_/ |_//_/|_|  |___//_/ \__,_/ \___/ \____/ 

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
-----------------------------------------------------------------------------
*/
#ifndef __NXVIDEOPrerequisites_H__
#define __NXVIDEOPrerequisites_H__
 
#include "NxVideo_DLL.h"

#define ThreadNxVideoUrlCreate 1000 
#define ThreadNxVideoUrlOpen   1001
#define ThreadNxVideoUrlUpdate 1002
#define ThreadNxVideoUrlDelete 1003
#define ThreadNxVideoFileOpen 1004
#define ThreadNxVideoUrlPauseRendering 1005
#define ThreadNxVideoUrlMouseMove 1006
#define ThreadNxVideoUrlMouseDown 1007
#define ThreadNxVideoUrlMouseUp 1008

#define ThreadNxVideoFlashCreate 1010 
#define ThreadNxVideoFlashOpen   1011
#define ThreadNxVideoFlashUpdate 1012
#define ThreadNxVideoFlashMouseMove 1013
#define ThreadNxVideoFlashMouseUp 1014
#define ThreadNxVideoFlashMouseDown 1015
#define ThreadNxVideoFlashColorBackground 1016
#define ThreadNxVideoFlashSetVariable 1017
#define ThreadNxVideoFlashQuit 1018
#define ThreadNxVideoFlashPauseRendering 1019
#define ThreadNxVideoFlashSetFunction 1020

//#include "../Dependencies/OGRE/SDK/boost_1_42/boost/shared_ptr.hpp"


#include <memory>
using std::tr1::shared_ptr;

namespace Ogre
{
	class Viewport;
	class RenderWindow;
}

namespace Hikari
{
	class HikariManager;
	class FlashControl;
}

namespace Berkelium
{
	class Context;
	class Window;
}

#if defined( _MSC_VER )
// Turn off warnings generated by long std templates
// This warns about truncation to 255 characters in debug/browse info
#   pragma warning (disable : 4786)

// Turn off warnings generated by long std templates
// This warns about truncation to 255 characters in debug/browse info
#   pragma warning (disable : 4503)

// disable: "conversion from 'double' to 'float', possible loss of data
#   pragma warning (disable : 4244)

// disable: "truncation from 'double' to 'float'
#   pragma warning (disable : 4305)

// disable: "<type> needs to have dll-interface to be used by clients'
// Happens on STL member variables which are not public therefore is ok
#   pragma warning (disable : 4251)

// disable: "non dll-interface class used as base for dll-interface class"
// Happens when deriving from Singleton because bug in compiler ignores
// template export
#   pragma warning (disable : 4275)

// disable: "C++ Exception Specification ignored"
// This is because MSVC 6 did not implement all the C++ exception
// specifications in the ANSI C++ draft.
#   pragma warning( disable : 4290 )

// disable: "no suitable definition provided for explicit template
// instantiation request" Occurs in VC7 for no justifiable reason on all
// #includes of Singleton
#   pragma warning( disable: 4661)

// libsswf warnings
#   pragma warning( disable:  4995)

// iole
#   pragma warning( disable:  4099)


// disable: deprecation warnings when using CRT calls in VC8
// These show up on all C runtime lib code in VC8, disable since they clutter
// the warnings with things we may not be able to do anything about (e.g.
// generated code from nvparse etc). I doubt very much that these calls
// will ever be actually removed from VC anyway, it would break too much code.
#	pragma warning( disable: 4996)

// disable: "conditional expression constant", always occurs on 
// OGRE_MUTEX_CONDITIONAL when no threading enabled
#   pragma warning (disable : 201)

#endif

class videoInput;

namespace NxVideo_Namespace {

enum NxVideoStreamType 
{
	NxVideoAvi,
	NxVideoMov,
	NxVideoWeb,
	NxVideoSwf,
	NxVideoFlv
}; 

enum NxVideo_PlayBack_Type 
{ 
	VIDEO_PLAYBACK_NORMAL, // play and stop
	VIDEO_PLAYBACK_REVERSE, // play reverse and stop
	VIDEO_PLAYBACK_BOUNCE, // play both ways without stop
	VIDEO_PLAYBACK_RANDOM 
}; 

enum NxVideo_PlayBack_Status
{  
	VIDEO_STATUS_PLAY,
	VIDEO_STATUS_PAUSE,
	VIDEO_STATUS_STOP
};

enum NxVideoCaptureDeviceType
{ 
	NxVideoCaptureDS,
	NxVideoCaptureVFW,
	NxVideoCaptureQuicktime,
	NxVideoCapturePGR
};

typedef struct VideoPixel24bitTag
{
	BYTE blue;
	BYTE green;
	BYTE red;
} VideoPixel24bit;

typedef struct VideoPixel32bitTag 
{
	BYTE blue;
	BYTE green;
	BYTE red;
	BYTE alpha;
} VideoPixel32bit;

 
class NxVideoUtils;
class NxVideoBuffer;
class NxVideoManager;
class NxVideo_Avi_Player ;
class NxVideo_Avi_Manager ;
class NxVideo_Flash_Reader;
class NxVideo_Flash_Creator ;
class NxVideo_FLV_Reader ;
class NxVideo_Info ;
class NxVideo_Player ;
class NxVideo_URL ;
class NxVideoGrabberVFW ;
class NxVideoGrabberFireFly ;
class NxVideoStream ;

struct NxVideoVFW;
struct NxVideoQuickTime;
struct NxVideoFlashSwf;
struct NxVideoFlashFlv;
struct NxVideoRecorderVFW;

struct NxVideoDeviceDS;
struct NxVideoDeviceVFW;
struct NxVideoDeviceQTM;
struct NxVideoDevicePGR;
 
struct AVI_CODEC_INFO;
struct Video_Info;

class DownloadStatus;
class NxVideo_URLCallback ;
class SocketInfo;

  /* Template class for creating single-instance global classes */
	template <typename T> class Singleton
    {
		protected:
        static T* ms_Singleton;
		public:
        Singleton( void )
        {
            assert( !ms_Singleton );
			#if defined( _MSC_VER ) && _MSC_VER < 1200	 
            int offset = (int)(T*)1 - (int)(Singleton <T>*)(T*)1;
            ms_Singleton = (T*)((int)this + offset);
			#else
			ms_Singleton = static_cast< T* >( this );
			#endif
        }

        ~Singleton( void )
		{  
			assert( ms_Singleton );
			ms_Singleton = 0;
		}

        static T& getSingleton( void )
		{	
			assert( ms_Singleton );
			return ( *ms_Singleton );
		}

        static T* getSingletonPtr( void )
		{ 
			return ms_Singleton;
		}
    };
 
}// NxVideo_Namespace

#endif
